package com.jjh.jhwebserver.context;

import com.jjh.jhwebserver.util.RegexUtil;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;

/**
 * @author JJH
 */
public class HttpServletRequest extends JhRequset{


    /**
     * 方法类型
     */
    private String method;
    /**
     * 请求路径
     */
    private String url;
    /**
     * 参数列表
     */
    private HashMap<String,String> params = new HashMap<>();
    /**
     * 请求头信息
     */
    private HashMap<String,String> headers = new HashMap<>();
    /**
     * 请求体（json格式）
     */
    private String requestBody;
    /**
     * socket的输入流
     */
    private InputStream inputStream;


    public HttpServletRequest(InputStream inputStream) throws IOException {

        this.inputStream = inputStream;
        this.init(this.inputStream);
    }


    /**
     * 对http请求的封装
     * @param inputStream socket输入流
     */
    private void init(InputStream inputStream) throws IOException {
        try {

            BufferedReader reader =
                    new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
            //读取第一行
            String firstLine = reader.readLine();
            // System.out.println(firstLine);
            String[] s = firstLine.split(" ");
            //设置该请求的方法
            this.method = s[0];
            //设置请求路径
            String allPath = s[1];

            if(allPath.contains("?")){
                //如果包含了？，那么要截取？之前的
                this.url = allPath.substring(0, allPath.indexOf("?"));
            }else {
                this.url = allPath;
            }



            /**
             * 对get请求处理
             */
            if("GET".equals(method)){
                int index = allPath.indexOf("?");
                if (index != -1) {
                    //有参数
                    String params = allPath.substring(index + 1);
                    //判断是否有&号
                    if (params.contains("&")) {
                        String[] parms = params.split("&");
                        for (String parm : parms) {
                            String[] str = parm.split("=");
                            this.params.put(str[0], str[1]);
                        }
                    } else {
                        //就一个参数
                        String[] str = params.split("=");
                        this.params.put(str[0], str[1]);
                    }
                }
            }

            /**
             * 对请求头处理
             */
            String msg;
            while ((msg = reader.readLine()) != null) {
                if (msg.length() == 0) {
                    break;
                }
                String[] headers = msg.split(":");
                String header = headers[0];
                String value = headers[1].trim();
                this.headers.put(header,value);
            }

            /**
             * 对POST请求处理
             */
            if("POST".equals(method)) {
                StringBuffer sb = new StringBuffer();
                String length = this.headers.get("Content-Length");
                int len = Integer.parseInt(length);
                for(int i=0;i<len;i++){
                    char ch= (char) reader.read();
                  /*
                     用一下正则表达式来排除数字，英文字母特殊字符
                     这样这个字符肯定是中文，utf-8中文是三个字符表示的，
                     这时让i=i+2就可以了
                   */
                    String chs = String.valueOf(ch);
                    if (RegexUtil.isChinese(chs)) {
                        i = i+2;
                    }
                    sb.append(chs);
                }
                String body = sb.toString();

                //判断是那种提交格式
                String type = this.headers.get("Content-Type");
                if("application/x-www-form-urlencoded".equals(type)){
                    //表单提交格式,把它添加到参数列表中去
                    if(body.contains("&")){
                        String[] split = body.split("&");
                        for (String parms : split) {
                            String[] p = parms.split("=");
                            this.params.put(p[0],p[1]);
                        }
                    }else {
                        //就一个参数
                        String[] str = body.split("=");
                        this.params.put(str[0],str[1]);
                    }
                } else if (type.contains("application/json")) {
                    //json格式的请求体
                    this.requestBody = body;
                }
            }


        }catch (Exception e){
            e.printStackTrace();
        }

    }


    private void setCharacterEncoding(String encoding){

    }

    /**
     * 返回请求方法
     * @return 请求方法
     */
    public String getMethod() {
        return method;
    }

    /**
     * 返回请求路径
     * @return 请求路径
     */
    public String getUrl() {
        return url;
    }

    /**
     * 返回请求参数，包括get请求和post请求的表单形式
     * @return 请求参数map集合
     */
    public HashMap<String, String> getParams() {
        return params;
    }

    /**
     * 返回psot请求体
     * @return 请求体
     */
    public String getRequestBody(){
        return this.requestBody;
    }

    /**
     * 返回请求头信息
     * @return 请求头信息集合
     */
    public HashMap<String,String> getHeaders(){
        return this.headers;
    }

    /**
     * 根据参数名称返回参数值
     * @param parm 参数名称
     * @return 参数值
     */
    public String getPramater(String parm){
        if (this.params.get(parm) != null) {
            return this.params.get(parm);
        }else{
            return null;
        }
    }




}
